---
title: 证书透明化 (CT) 日志
slug: ct-logs
lastmod: 2025-08-27
show_lastmod: 1
---


<p>
  <a href="https://www.certificate-transparency.org/what-is-ct"
    >证书透明化 (CT)</a
> 是一套记录并监控 TLS 证书颁发流程的系统。 CT 使普通人观察、研究证书颁发过程的能力大幅增强，有力地促进了 CA 生态系统和网络安全的发展。 因此，CT 正迅速成为关键基础设施。
</p>

<p>
  Let's Encrypt 签发的所有证书都会录入 CT 日志。 同时我们也运作着若干 CT 日志系统，
  欢迎所有可信的证书颁发机构将证书提交至我们的日志。 我们的CT日志中已包含许多证书颁发机构的根证书。 如果您所经营的证书颁发机构不在我们的可信颁发者列表中，请在<a href="https://github.com/letsencrypt/ct-log-metadata">此处</a>发起 Issue。
</p>

<p>
  在我们的社群论坛中开启 <a
    href="https://community.letsencrypt.org/t/about-the-ct-announcements-category"
    >CT Announcements</a
> 分类的推送通知，即可第一时间获取有关 CT 日志的重要公告。
</p>

<h2>资金来源</h2>

<p>
  如果您所属的机构有意支持我们持续开展这项事业，请考虑<a href="https://www.abetterinternet.org/sponsor/">捐款或成为赞助商</a>。
</p>

<h2>技术架构</h2>

<p>
  请参阅我们的英文博客文章 <a href="https://letsencrypt.org/2019/11/20/how-le-runs-ct-logs.html"
    >How Let's Encrypt Runs CT Logs</a
>。
</p>

<h2>日志监控</h2>

<p>
  Let's Encrypt 研发了一款开源的 CT 日志监控工具 <a href="https://github.com/letsencrypt/ct-woodpecker">CT Woodpecker</a>。 我们使用这一工具监控自营日志系统的稳定性和准确性，期待它能在更多场合发挥作用。
</p>

<h2>CT 日志服务器</h2>
<p>
CT 日志在其生命期内所经历的各种状态可在<a href="https://googlechrome.github.io/CertificateTransparency/log_states.html">此处</a>详细了解。
</p>

<h3>Sunlight</h3>
<p>
  Let's Encrypt 正在逐步将日志系统转移至 <a href="https://sunlight.dev">Sunlight</a>。
  各日志系统接受的根证书、公钥、日志 ID、分片间隔等信息可以在下方列出的各系统首页中查询。
</p>
<p>我们新部署的生产环境 CT 日志系统是 Sycamore 和 Willow，只接受由可信的 CA 颁发的证书。</p>
<ul>
  <li><b>Sycamore</b>: <a href="https://log.sycamore.ct.letsencrypt.org/">log.sycamore.ct.letsencrypt.org</a></li>
  <li><b>Willow</b>: <a href="https://log.willow.ct.letsencrypt.org/">log.willow.ct.letsencrypt.org</a></li>
</ul>
<p>用于测试日志系统为 Twig，既接受由可信 CA 颁发的证书，也接受由某些测试 CA 颁发的证书，包括 Let's Encrypt 测试环境的证书。</p>
<ul>
  <li><b>Twig</b>: <a href="https://log.twig.ct.letsencrypt.org/">log.twig.ct.letsencrypt.org</a></li>
</ul>


{{< ct_logs data="production" >}}
<li>
  Oak 已被 <a href="https://support.apple.com/en-us/HT209255">Apple</a> 和 <a href="https://github.com/chromium/ct-policy/blob/master/ct_policy.md"
    >Google</a
> 的 CT 项目收录。
</li>
<li>我们的生产环境 ACME 接口签发的证书也会提交至此系统。</li>
{{< /ct_logs >}} {{< ct_logs data="testing" >}}
<li>
  公开可信的证书<b>不应</b>含有此日志系统的 SCT。
</li>
<li>
  Let's Encrypt 的生产和<a href="/docs/staging-environment">测试</a>环境 ACME 接口签发的证书都会提交至 Sapling，但生产环境不会使用该系统的 SCT。
</li>
<li>
  我们在将新版本的 <a href="http://github.com/google/trillian">Trillian</a> 和 <a href="https://github.com/google/certificate-transparency-go"
    >certificate-transparency-go</a
> 部署到生产环境前会先在此系统中测试。
</li>
<li>
  Sapling 不仅接受 Oak 所包含的全部根证书，还接受部分用于测试的根证书。
</li>
<li>
  其他证书颁发机构也可以使用 Sapling 进行测试。
</li>
{{< /ct_logs >}}

<h2>日志操作</h2>
<p>
  如需查看某一 CT 日志系统包含的所有根证书，可以在任意 UNIX 命令行中执行以下命令：
</p>
<pre>
$ for i in $(curl -s https://oak.ct.letsencrypt.org/2020/ct/v1/get-roots | jq -r '.certificates[]'); do
    echo '------'; base64 -d &lt;&lt;&lt; "${i}" | openssl x509 -inform der -noout -issuer -serial
done
</pre>

<p>
  将证书提交至 CT 日志的操作通常由证书颁发机构完成。 如果您想尝试自行提交，可以先获取任一网站的 PEM 格式证书， 例如执行下列命令：
</p>
<pre>
$ echo | \
openssl s_client \
    -connect "letsencrypt.org":443 \
    -servername "letsencrypt.org" \
    -verify_hostname "letsencrypt.org" 2&gt;/dev/null | \
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' &gt; example.crt
</pre>

<p>
  证书需要以特定的 JSON 格式提交， 您可以使用 <a href="https://crt.sh/gen-add-chain">https://crt.sh/gen-add-chain</a> 提供的 JSON 生成器完成格式转换。 该页面会生成一份 JSON 文件， 您需要下载并按需重新命名此文件，然后通过以下命令执行证书链添加操作（参见 <a
    href="https://tools.ietf.org/html/rfc6962#section-4.1"
    >RFC 6962 的 4.1 节</a
>），将证书提交至 CT 日志系统。 该命令的输出中有一段数字签名，其内容实际上就是 <a href="https://letsencrypt.org/2018/04/04/sct-encoding.html">SCT</a>。 下文将进一步介绍这一数字签名。
</p>
<pre>
$ curl \
    -X POST \
   --data @example-json-bundle.json \
    -H "Content-Type: application/json" \
    -H "User-Agent: lets-encrypt-ct-log-example-1.0" \
   https://oak.ct.letsencrypt.org/2020/ct/v1/add-chain
{"sct_version":0,"id":"5xLysDd+GmL7jskMYYTx6ns3y1YdESZb8+DzS/JBVG4=","timestamp":1576689972016,"extensions":"","signature":"BAMARzBFAiEA4OmuTcft9Jq3XLtcdZz9XinXCvYEY1RdSQICXayMJ+0CIHuujkKBLmQz5Cl/VG6C354cP9gxW0dfgMWB+A2yHi+E"}
</pre>

<p>
  为了确认 CT 日志是由 Oak 2020 区块签名的，我们可以使用刚才输出的 id 字段执行以下命令， 结果即为 CT 日志的日志 ID。
</p>
<pre>
$ base64 -d &lt;&lt;&lt; "5xLysDd+GmL7jskMYYTx6ns3y1YdESZb8+DzS/JBVG4=" | xxd -p -c 64 | sed -e 's/../&:/g' -e 's/:$//' | tr '[:lower:]' '[:upper:]'
E7:12:F2:B0:37:7E:1A:62:FB:8E:C9:0C:61:84:F1:EA:7B:37:CB:56:1D:11:26:5B:F3:E0:F3:4B:F2:41:54:6E
</pre>

<p>
  数字签名字段可用于验证证书是否已提交至日志系统。 您可以阅读我们的英文博客 <a href="https://letsencrypt.org/2018/04/04/sct-encoding.html"
    >SCT deep dive guide</a
> 了解如何进一步解码其内容。
</p>
<pre>
$ base64 -d &lt;&lt;&lt; "BAMARzBFAiEA4OmuTcft9Jq3XLtcdZz9XinXCvYEY1RdSQICXayMJ+0CIHuujkKBLmQz5Cl/VG6C354cP9gxW0dfgMWB+A2yHi+E" | xxd -p -c 16 | sed -e 's/../&:/g' -e 's/:$//' | tr '[:lower:]' '[:upper:]'
04:03:00:47:30:45:02:21:00:E0:E9:AE:4D:C7:ED:F4
9A:B7:5C:BB:5C:75:9C:FD:5E:29:D7:0A:F6:04:63:54
5D:49:02:02:5D:AC:8C:27:ED:02:20:7B:AE:8E:42:81
2E:64:33:E4:29:7F:54:6E:82:DF:9E:1C:3F:D8:31:5B
47:5F:80:C5:81:F8:0D:B2:1E:2F:84
</pre>
